package com.gdust.hzx.manager.service.impl;

import com.gdust.hzx.manager.mapper.SysRoleMenuMapper;
import com.gdust.hzx.manager.service.SysMenuService;
import com.gdust.hzx.manager.service.SysRoleMenuService;
import com.gdust.hzx.model.dto.system.AssginMenuDto;
import com.gdust.hzx.model.entity.system.SysMenu;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * ClassName: SysRoleMenuServiceImpl
 * Package: com.gdust.spzx.manager.service.impl
 * Description:
 *
 * @Author syun
 * @Create 2024/11/25 20:49
 * @Version 1.0
 */
@Service
public class SysRoleMenuServiceImpl implements SysRoleMenuService {
    //注入角色菜单关系表的mapper
    @Autowired
    private SysRoleMenuMapper sysRoleMenuMapper;

    //注入菜单表的service
    @Autowired
    private SysMenuService sysMenuService;


    /**
     * 查询所有菜单以及角色分配的菜单ID列表
     *
     * 功能描述：
     * 1. 查询系统中所有菜单数据，用于展示完整的菜单结构。
     * 2. 根据角色ID查询该角色已分配的菜单ID列表，用于前端进行已选菜单的标记或回显。
     *
     * @param roleId 角色ID，用于查询角色已分配的菜单
     * @return 包含所有菜单数据和角色已分配菜单ID列表的Map对象
     */
    @Override
    public Map<String, Object> findSysRoleMenuByRoleId(Long roleId) {
        // 查询系统中所有的菜单节点
        List<SysMenu> sysMenuList = sysMenuService.findNodes();

        //查询角色分配过菜单id列表:根据角色ID查询对应的菜单ID
        List<Long> roleMenuIds = sysRoleMenuMapper.findSysRoleMenuByRoleId(roleId);

        // 封装结果数据:封装包含所有菜单数据和角色已分配菜单ID列表的Map对象
        HashMap<String, Object> map = new HashMap<>();
        // 添加所有菜单列表
        map.put("sysMenuList",sysMenuList);
        // 添加角色已分配的菜单ID列表
        map.put("roleMenuIds",roleMenuIds);


        return map;
    }

    /**
     * 保存角色分配的菜单数据
     *
     * 功能描述：
     * 1. 根据角色ID从 `sys_role_menu` 表中删除该角色之前分配的菜单数据。
     * 2. 将新的菜单数据保存到 `sys_role_menu` 表中，实现角色与菜单的重新分配。
     * 3. 实现逻辑为：先删除原有数据，再新增新数据。
     *
     * @param assginMenuDto 请求参数实体类，包含以下信息：
     *                      - `roleId`: 角色ID
     *                      - `menuIdList`: 菜单ID的集合，每个集合元素为一个 `Map` 对象：
     *                         - `key`: 菜单的ID
     *                         - `value`: 是否为半开状态（0：否，1：是）
     */
    @Override
    public void doAssign(AssginMenuDto assginMenuDto) {
        //1.先删除角色分配菜单数据(根据角色id从角色菜单关系表中删除菜单数据)
        sysRoleMenuMapper.deleteByRoleId(assginMenuDto.getRoleId());
        //2.保存分配数据(添加新的菜单数据到角色菜单关系表中)
        List<Map<String, Number>> menuInfo = assginMenuDto.getMenuIdList();//调用选中的菜单id的集合。 Map的键表示菜单的id，值表示是否为半开; 0否，1是
        // 判断菜单ID集合是否为空，避免空指针异常和不必要的操作
        if(menuInfo != null && menuInfo.size()>0){
            // 批量保存新的菜单分配数据到角色菜单关系表
            sysRoleMenuMapper.doAssign(assginMenuDto);
        }
    }

}
